<?php
// https://zhuanlan.zhihu.com/p/80538556?utm_source=wechat_session&utm_medium=social&s_r=0
class Solution {

    /**
     * @param String $str
     * @return Integer
     */
    function lengthOfLongestSubstring($str) {
        $char_pos = array();

        $str_len = strlen($str);

        $curLength = 0; // 记录以当前字符的上一个字符为结尾的最长不重复子字符串长度
        $maxLength = 0; // 记录最长不重复子串长度

        for ($i=0; $i<$str_len; $i++) {
            // 没有出现过
            if (! isset($char_pos[$str[$i]])) {
                $curLength++;
            // 如果上一次出现的位置不在当前最长不重复的子串中
            } else if (($i - $char_pos[$str[$i]]) > $curLength) {
                $curLength++;
            // 如果上一次出现的位置在当前最长不重复的子串中
            } else {
                $curLength = $i - $char_pos[$str[$i]];
            }

            $char_pos[$str[$i]] = $i;

            if ($maxLength < $curLength) {
                $maxLength = $curLength;
            }
        }
        return $maxLength;
    }
}